package servidor.controladorsistema.ip;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;



public class IPDAOJPA implements IPDAO {
	public <E> void inserir (E entidade) {
		EntityManager em = IPJPAUtil.getEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		em.persist(entidade);
		tx.commit();
	}
	
	public <E> E recuperar (Class<E> classe, Long id) {
		EntityManager em = IPJPAUtil.getEntityManager();
		E entidade = em.find(classe, id);
		return entidade;
	}
	
	public <E> void atualizar (E entidade) {
		EntityManager em = IPJPAUtil.getEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		em.merge(entidade);
		tx.commit();
	}
	
	public <E> void deletar (Class<E> classe, Long id) {
		EntityManager em = IPJPAUtil.getEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		E entidade = em.find(classe, id);
		em.remove(entidade);
		tx.commit();
	}	
	
	public <E> List<E> listar (Class<E> classe) {
		EntityManager em = IPJPAUtil.getEntityManager();
		Query q = em.createQuery("select e from " + 
				classe.getSimpleName() + " e");
		@SuppressWarnings("unchecked")
		List<E> lista = q.getResultList();
		return lista;
	}
	
	public <E> List<E> listarOrdenado (Class<E> classe, String atributo) {
		EntityManager em = IPJPAUtil.getEntityManager();
		Query q = em.createQuery("select e from " + 
				classe.getSimpleName() + " e order by e." + atributo);
		@SuppressWarnings("unchecked")
		List<E> lista = q.getResultList();
		return lista;
	}
	
	public <E> List<E> listarNamedQuery (String namedQuery, Object... params) {
		EntityManager em = IPJPAUtil.getEntityManager();
		Query q = em.createNamedQuery(namedQuery);
		for (int i = 0; i < params.length; ++i)
			q.setParameter(i+1, params[i]);
		@SuppressWarnings("unchecked")
		List<E> lista = q.getResultList();
		return lista;
	}
}
